#include "headers/Executor.h"
#include "headers/Operacoes.h"
#include "headers/Tracker.h"
#include "headers/Disco.h"
#include "headers/Buffer.h"

#include <string.h>
#include <time.h>
#include <stdlib.h>

void freePagina(Pagina* pag);

void Executar() {
	tempo = clock();

	CriarTracker();
	CriarBuffer();
	//Vari�veis para pegar posi��o no tracker
	char* flag = malloc(sizeof(char));
	int* offset = malloc(sizeof(int));

	char* randOP = malloc(sizeof(char));
	int* randGID = malloc(sizeof(int));

/* 	int randOP;
	int randGID;*/

	//srand(time(NULL ));
	int count_miss = 0;
	int count_hits = 0;
	int count_alter = 0;
	Pagina* pagTemp; //= (Pagina*) malloc(sizeof(Pagina));

	initRemainingOperations();

	int i, op;
	for (i = 0; i < TOTAL_OPERATIONS; i++) {

		if(DEBUG_MODE==1){
			printf("\n ID DA ITERACAO: %d\n\n", i);
		}

		pagTemp = (Pagina*) malloc(sizeof(Pagina));

/*		printf("Id desejado: \n");
		scanf("%d", &randGID);*/

		generateOperations(randGID,randOP);

		trac_LocalizarPagina(*randGID, flag, offset); //Procura no tracker onde est� a p�gina.

/*		printf("Operacao desejada: \n");
		scanf("%d", &randOP);*/

		switch (*randOP) { //A = 87, L = 82 (alterar, ler)
		case 87: //Alterar

			count_temp_escrita++;

			if (*flag != NULL) { //Ou seja, se a pagina estiver no buffer e for alterada.
				count_hits++;
				taxa_acerto++;//Incrementa taxa_acerto (variavel setada em Buffer.c/h)
				buff_AlterarPagina(*offset);
				trac_HitDateAlter(*randGID); // MODIFICADO o *

				//Print

			}else{	//Ou seja, se a pagina N�O estiver no buffer e for alterada.
				count_miss++;
				CriarPagina(disc_LerPagina(*randGID, "paginas.txt"), pagTemp); //Busca ela no txt de paginas e a "cria"

				buff_EscreverPagina(pagTemp); //Vai direto para o campo de leitura, pois toda pagina vai pra lá no começo.
				buff_AlterarPagina(trac_data[pagTemp->id].offset); //Envia sua posicao ja no buffer para ser alterada.

				trac_HitDateAlter(*randGID); //Incrementa hit, date e alter;
				//freePagina(pagTemp);
				//print
			}

			*offset = -1;
			*flag = NULL;
			/*printf("Pagina lida: \n");
			printf("GID:      %d\n", pagTemp->id);
			printf("Conteudo: %s\n", pagTemp->conteudo);*/
			break;

		case 82: //Ler

			count_temp_leitura++;

			if (*flag != NULL) { //Ou seja, se a pagina estiver no buffer e for ler.
				count_hits++;
				taxa_acerto++;//Incrementa taxa_acerto (variavel setada em Buffer.c/h)

				pagTemp = buff_LerPagina(*randGID);
				/*printf("Pagina lida: \n");
				printf("GID:      %d\n", pagTemp->id);
				printf("Conteudo: %s\n", pagTemp->conteudo);*/

				trac_HitDate(*randGID);

			}else{	//Ou seja, se a pagina N�O estiver no buffer e for ler.
				count_miss++;
				CriarPagina(disc_LerPagina(*randGID, "paginas.txt"), pagTemp); //Busca ela no txt de paginas e a "cria"
				buff_EscreverPagina(pagTemp);

				/*printf("Pagina lida: \n");
				printf("GID:      %d\n", pagTemp->id);
				printf("Conteudo: %s\n", pagTemp->conteudo);*/

				trac_HitDate(*randGID);
				//freePagina(pagTemp);
			}

			*offset = -1;
			*flag = NULL;
			break;
		}

	}


	printf("Total de Operacoes: %d", TOTAL_OPERATIONS);
	printf("\n% Operacoes Escrita: %i", TOTAL_WRITE_OPERATIONS_PERCENT);
	printf("\n-------------------------------------------------------");
	printf("\n% Total de Páginas (# paginas BD): %i", NUMERO_DE_PAGINAS);
	printf("\n% Tamanho do Buffer (# páginas): %i", CAPACIDADE_DO_BUFFER);
	printf("\n-------------------------------------------------------");
	printf("\nChamadas LRU: %d", count_LRU);
	printf("\nChamadas SCMBP: %d", count_SCMBP);
	printf("\ncount_SCMBP_dirty: %d", count_SCMBP_dirty);
	printf("\n-------------------------------------------------------");
	printf("\nMiss: %d",count_miss);
	printf("\nHits: %d",count_hits);
	printf("\n-------------------------------------------------------");


}


void freePagina(Pagina* pag){
	free(pag->conteudo);
	//memcpy(pag->conteudo, "\0", TAMANHO_CONTEUDO);
}

